﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarvellousWorks.PracticalPatternNet8.Concept.Generics;

/// <summary>
/// 目标接口，定义客户端所需的方法。
/// </summary>
public interface ITarget
{
    /// <summary>
    /// 客户端调用的请求方法。
    /// </summary>
    void Request();
}

/// <summary>
/// 适配器接口，定义被适配类的特殊请求方法。
/// </summary>
public interface IAdapter
{
    /// <summary>
    /// 被适配类的特殊请求方法。
    /// </summary>
    void SpecificRequest();
}

/// <summary>
/// 泛型适配器基类，实现了ITarget接口。
/// 通过泛型参数T，将实现IAdapter接口的类型适配为ITarget接口。
/// </summary>
/// <typeparam name="T">必须实现IAdapter接口并具有无参构造函数的类型。</typeparam>
public abstract class GenericAdapterBase<T> : ITarget where T : IAdapter, new()
{
    /// <summary>
    /// 实现ITarget接口的Request方法，内部调用T的SpecificRequest方法。
    /// </summary>
    public virtual void Request()
    {
        // 创建T的实例并调用其SpecificRequest方法，实现适配。
        new T().SpecificRequest();
    }
}

